package com.theaf.core.repo.base;

import com.theaf.core.repo.specification.SqlBuilder;
import com.theaf.core.repo.specification.SubqueryEx;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Author:songwenke
 * @Description:Repository基类
 * @Date:create in 17:06 2017/12/12
 * @Modified By:
 **/
@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID>,JpaSpecificationExecutor<T> {
    /**
     * 自定义条件查询
     * @param term 条件
     * @param order 排序
     * @return
     */
    List<T> findCustom(Map<String,Object> term,Map<String,Boolean> order);

    /**
     * 自定义条件查询
     * @param term 条件
     * @param order 排序
     * @param page 页码
     * @param size 页记录数
     * @return
     */
    Page<T> findCustom(Map<String,Object> term, Map<String,Boolean> order,int page,int size);

    /**
     * 自定义条件查询
     * @param term 条件,包括分页及排序
     * @return
     */
    Page<T> findCustom(Condition term);

    /**
     * 子查询
     * @param sqlBuilder
     * @return
     */
    SubqueryEx subquery(SqlBuilder sqlBuilder);

    /**
     * 功能最强的查询方式
     * @param specification
     * @return
     */
    List query(Specification specification,int page,int size);
    List query(Specification specification);

    /**
     * 初始级别编码
     * @param parent 父对象
     * @param levelCodeField 级别编码字段
     * @param idField 主键字段
     * @param parentField 父ID字段
     */
    void initLevel(T parent,String levelCodeField,String idField,String parentField);

    /**
     * 判断字段值是否改变
     * @param id
     * @param field
     * @param value
     * @return
     */
    boolean judgeChange(ID id,String field,Object value);

    /**
     * 自定义更新
     * @param set 更新数据
     * @param specification 条件
     */
    int updateCustom(Map<String,Object> set,SqlBuilder specification);
    int updateCustom(Map<String,Object> set, SqlBuilder specification, Class entityClass);

    /**
     * 自定义删除
     * @param specification 条件
     * @return
     */
    int deleteCustom(SqlBuilder specification);

    /**
     * 主健查询对象，如果ID为空或查询结果为空则新建对象
     * @param id 主健
     * @return
     */
    T findByIdNewIfisNull(ID id);
}
